package com.arpa.wms.service;

import com.arpa.core.web.Result;
import com.arpa.wms.domain.dto.WmsTaskDTO;
import com.arpa.wms.domain.entity.WmsTask;
import com.arpa.wms.domain.enums.WmsTaskTypeEnum;
import com.arpa.wms.domain.vo.WmsTaskVO;
import com.baomidou.mybatisplus.extension.service.IService;

import java.math.BigDecimal;
import java.util.List;
import java.util.concurrent.Future;

/**
 * <p>
 * 任务中心 Service
 * </p>
 *
 * @author LEO
 * @since 2020-10-09
 */
public interface IWmsTaskService extends IService<WmsTask> {





    /**
     * 查询列表
     *
     * @param wmsTaskDTO
     * @return
     */
    List<WmsTaskVO> queryList(WmsTaskDTO wmsTaskDTO);


    /**
     * 查询合计,包含总数
     *
     * @param wmsTaskDTO
     * @return
     */
    WmsTaskVO queryListSum(WmsTaskDTO wmsTaskDTO);

    /**
     * 下发任务
     * @param taskType 任务类型 任务类型：RECEIVE收货、PUTAWAY上架、PICKING拣货、CHECK复核、INVENTORY盘点、MOVE移位
     * @param sourceCode 关联单号
     */
    Future<Boolean> issue(final WmsTaskTypeEnum taskType, final String sourceCode, final String userCode, final String groupCode);

    /**
     * 指派人员
     * @param taskCode 任务号
     * @param userCode 作业人
     * @param assignBy 指派人
     */
    Future<Boolean> assign(String taskCode, String userCode,String assignBy,String groupCode);

    /**
     *  @author: Allen chen
     *  @Date: 2020/10/21 13:35
     *  @Description:
     */
    WmsTaskVO queryPickingTaskByCode(WmsTaskDTO taskDTO);

    /**
     * 取消任务指派
     * @param taskCode 任务号
     */
    Future<Boolean>  unassign(String taskCode,String groupCode);

    /**
     * 通过任务Code获取任务详情
     * @param code 任务code
     * @return
     */
    WmsTaskVO getByCode(String code);

    /**
     * 占用任务（自动指派），如果任务本来是指派给自己的，则不需要处理，
     * 如果任务未被指派，则将任务指派给当前用户；
     * 如果任务已被指派给其他人，则提示；
     * @param wmsTask 任务
     */
    void autoAssign(WmsTask wmsTask);


    /**
     * @description
     * 更新任务状态为作业中，同时占用任务
     * @author xuyang
     * @date 2020/10/27 10:12
     * @param sourceCode:
     **/
    Result updateTaskWorkingBySourceCode(String sourceCode);

    /**
     * @description
     * 更新任务状态为作业中，同时占用任务
     * @author xuyang
     * @date 2020/12/7 10:12
     * @param taskCode:
     **/
    Result updateTaskWorkingByTaskCode(String taskCode);

    /**
     * @description
     * 根据上架单编码更新作业量
     * @author xuyang
     * @date 2020/10/31 8:18
     * @param code:
     **/
    int putawayUpdateJobQuantity(String code,String groupCode);

    /**
     * @description
     * 根据移位单所属任务编码更新作业量
     * @author xuyang
     * @date 2020/12/7 18:18
     * @param code:
     **/
    int moveUpdateJobQuantity(String code);

    /**
     * @description
     * 根据拣货单号更新作业量
     * @author xuyang
     * @date 2020/11/4 8:36
     * @param sourceCode:
     **/
    int pickingUpdateJobQuantity(String sourceCode);

    int updateStatusIfFinishJob(String taskCode, String status);

    /**
     * PDA 查询列表
     *
     * @param wmsTaskDTO
     * @return
     */
    List<WmsTaskVO> queryList4Pda(WmsTaskDTO wmsTaskDTO);

    /**
     * PDA 查询合计,包含总数
     *
     * @param wmsTaskDTO
     * @return
     */
    WmsTaskVO queryListSum4Pda(WmsTaskDTO wmsTaskDTO);


    /**
     * 判断给定的单号有任务，或任务还没完全完成； 如果有相关任务且任务未完成，则返回true；
     * @param sourceCode
     * @return
     */
    boolean hasUnFinishTaskForSourceCode(String sourceCode);



    /**
     * PDA 任务中心列表
     *
     * @param wmsTaskDTO
     * @return
     */
    List<WmsTaskVO> pdaTaskList(WmsTaskDTO wmsTaskDTO);

    /**
     * PDA 任务中心列表合计,包含总数
     *
     * @param wmsTaskDTO
     * @return
     */
    WmsTaskVO pdaTaskListSum(WmsTaskDTO wmsTaskDTO);

    /**
     * PDA 任务中心列表合计,包含总数
     *
     * @param wmsTaskDTO
     * @return
     */

    /**
     * 查询各订单标识对应的任务信息
     */
    List<WmsTaskVO> queryTaskInfoByOrderTag(WmsTaskDTO wmsTaskDTO);

    /**
     * PDA 任务中心列表合计,包含总数
     *
     * @param wmsTaskDTO
     * @return
     */


    /**
     * 根据单号结束任务
     * @author liuxr
     * @date 2021/5/15 8:47
     * @param sourceCode 单号
     * @param userCode 操作人code
     * @param userName 操作人名称
     * @return
     */
    int endTask(String sourceCode,String userCode,String userName);

    /**
     * 根据单号结束任务
     * @author liuxr
     * @date 2021/5/15 8:47
     * @param sourceCode 单号
     * @param userCode 操作人code
     * @param userName 操作人名称
     * @return
     */
    int endTaskYb(String sourceCode,String userCode,String userName,String groupCode);

    /**
     * 检查任务是否完成
     * @author liuxr
     * @date 2021/5/29 12:19
     * @param sourceCode
     * @return boolean
     */
    boolean isCompleted(String sourceCode);

    /**
     * 根据来源单号更新任务数量
     * @author rfwang
     * @date 2022/1/25
     * @param sourceCode
     * @param quantity
     * @return boolean
     */
    boolean updateJobQuantity(String sourceCode, BigDecimal quantity);

    /**
     * 重新构建任务单号
     * @author rfwang
     * @date 2022/3/15
     * @param wmsTaskDTO
     */
    void reconstructParams(WmsTaskDTO wmsTaskDTO);

    /**
     * 重新构建任务单号
     * @author rfwang
     * @date 2022/3/15
     * @param wavePickingCode
     * @param groupCode
     */
    void updateTaskStatusByWaybillCheck(String wavePickingCode,String groupCode,BigDecimal recheckQuantity,boolean updateRecheckNow);



}
